//package com.sam4cloud.generate.config.v3_1_2;
//
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.annotation.DbType;
//import com.baomidou.mybatisplus.annotation.FieldFill;
//import com.baomidou.mybatisplus.generator.AutoGenerator;
//import com.baomidou.mybatisplus.generator.InjectionConfig;
//import com.baomidou.mybatisplus.generator.config.*;
//import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
//import com.baomidou.mybatisplus.generator.config.po.TableFill;
//import com.baomidou.mybatisplus.generator.config.po.TableInfo;
//import com.baomidou.mybatisplus.generator.config.rules.DateType;
//import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
//import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
//import com.sam4cloud.common.core.cons.MicroCloudCons;
//import com.sam4cloud.generate.enums.SeniorityEnum;
//
//import java.util.*;
//
///**
// * @Author: Sam
// * @Date: 2022/11/7 16:26
// * @Description: 代码生成器父类 3.12版本
// */
//public class SuperGenerator {
//
//    /**
//     *         <!--generate支持-->
//     *         <dependency>
//     *             <groupId>com.baomidou</groupId>
//     *             <artifactId>mybatis-plus-generator</artifactId>
//     *             <version>3.1.2</version>
//     *         </dependency>
//     *         <!--模板引擎 velocity-->
//     *         <dependency>
//     *             <groupId>org.apache.velocity</groupId>
//     *             <artifactId>velocity-engine-core</artifactId>
//     *             <version>2.0</version>
//     *             <scope>compile</scope>
//     *             <optional>true</optional>
//     *         </dependency>
//     */
//
//    /**
//     * 获取TemplateConfig 不生成可以在这设置null
//     *
//     * @return
//     */
//    protected TemplateConfig getTemplateConfig() {
//        return new TemplateConfig()//自定义vm模板
//                .setEntity("/templates/v3_1_2/entity.java")
//                .setEntityKt("/templates/v3_1_2/entity.kt")
//                .setService("/templates/v3_1_2/service.java")
//                .setServiceImpl("/templates/v3_1_2/serviceImpl.java")
//                .setMapper("/templates/v3_1_2/mapper.java")
//                .setXml("/templates/v3_1_2/mapper.xml")
//                .setController("/templates/v3_1_2/controller.java");
//    }
//
//    /**
//     * 获取InjectionConfig
//     *
//     * @return
//     */
//    protected InjectionConfig getInjectionConfig(SeniorityEnum seniority, String moduleName, String packagePrefix) {
//        packagePrefix = StrUtil.isEmpty(packagePrefix) ? packagePrefix : packagePrefix + "/";
//        final String prefix = packagePrefix;
//        return new InjectionConfig() {
//            @Override
//            public void initMap() {
//                Map<String, Object> map = new HashMap<>();
//                this.setMap(map);
//            }
//        }.setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig(
//                "/templates/mapper.xml.vm") {
//            // 自定义输出文件目录
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                return getResourcePath(seniority, moduleName) + "/mapper/" + prefix + tableInfo.getEntityName() + "Mapper.xml";
//            }
//        }));
//    }
//
//    /**
//     * 获取PackageConfig
//     *
//     * @return
//     */
//    protected PackageConfig getPackageConfig(String packageLocation, String packagePrefix) {
//        packagePrefix = StrUtil.isEmpty(packagePrefix) ? packagePrefix : "." + packagePrefix;
//        return new PackageConfig()
//                .setParent(packageLocation + packagePrefix)
//                .setController("controller")
//                .setEntity("model.entity")
//                .setMapper("mapper")
//                .setService("service")
//                .setServiceImpl("service.impl");
//    }
//
//    /**
//     * 获取StrategyConfig
//     *
//     * @param tableName
//     * @return
//     */
//    protected StrategyConfig getStrategyConfig(String tablePrefix, String... tableName) {
//        List<TableFill> tableFillList = getTableFills();
//        return new StrategyConfig()
//                // 全局大写命名
//                .setCapitalMode(false)
//                // 去除表前缀
//                .setTablePrefix(tablePrefix)
//                //去除字段前缀
//                //.setFieldPrefix("")
//                // 表名生成策略
//                .setNaming(NamingStrategy.underline_to_camel)
//                // 需要生成的表
//                //.setInclude(new String[] { "user" })
//                .setInclude(tableName)
//                // 自定义实体父类
//                .setSuperEntityClass("com.sam4cloud.common.core.model.supers.Convert")
//                // 自定义实体，公共字段
//                //.setSuperEntityColumns("id")
//                // 表填充字段
//                .setTableFillList(tableFillList)
//                // 自定义 mapper 父类
//                //.setSuperMapperClass("com.sam4cloud.common.core.model.supers.BaseMapper")
//                // 自定义 controller 父类
//                //.setSuperControllerClass("com.sam4cloud.common.core.model.supers.SuperController")
//                // 自定义 service 实现类父类
//                //.setSuperServiceImplClass("com.sam4cloud.common.core.model.supers.BaseServiceImpl")
//                // 自定义 service 接口父类
//                //.setSuperServiceClass("com.sam4cloud.common.core.model.supers.BaseService")
//                // 【实体】是否生成字段常量（默认 false）
//                .setEntityColumnConstant(false)
//                // 【实体】是否为构建者模型（默认 false）
//                .setEntityBuilderModel(false)
//                // 【实体】是否为lombok模型（默认 false）<a href="https://projectlombok.org/">document</a>
//                .setEntityLombokModel(true)
//                // Boolean类型字段是否移除is前缀处理
//                .setEntityBooleanColumnRemoveIsPrefix(false)
//                // 生成 @RestController 控制器
//                .setRestControllerStyle(true)
//                // 生成逻辑删除标识
//                .setLogicDeleteFieldName("del_flag")
//                // 是否生成实体时，生成字段注解
//                .setEntityTableFieldAnnotationEnable(false);
//    }
//
//    /**
//     * 获取TableFill策略
//     *
//     * @return
//     */
//    protected List<TableFill> getTableFills() {
//        // 自定义需要填充的字段
//        List<TableFill> tableFillList = new ArrayList<>();
//        tableFillList.add(new TableFill("create_time", FieldFill.INSERT));
//        tableFillList.add(new TableFill("update_time", FieldFill.INSERT_UPDATE));
//        tableFillList.add(new TableFill("create_date", FieldFill.INSERT));
//        tableFillList.add(new TableFill("update_date", FieldFill.INSERT_UPDATE));
//        return tableFillList;
//    }
//
//    /**
//     * 获取DataSourceConfig
//     *
//     * @return
//     */
//    protected DataSourceConfig getDataSourceConfig(String url, String username, String password) {
//        return new DataSourceConfig()
//                // 数据库类型
//                .setDbType(DbType.MYSQL)
//                .setTypeConvert(new MySqlTypeConvert() {
//                    @Override
//                    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
//                        if ("bit".equals(fieldType.toLowerCase())) {
//                            return DbColumnType.BOOLEAN;
//                        }
//                        if ("tinyint".equals(fieldType.toLowerCase())) {
//                            return DbColumnType.BOOLEAN;
//                        }
//                        if ("date".equals(fieldType.toLowerCase())) {
//                            return DbColumnType.LOCAL_DATE;
//                        }
//                        if ("time".equals(fieldType.toLowerCase())) {
//                            return DbColumnType.LOCAL_TIME;
//                        }
//                        if ("datetime".equals(fieldType.toLowerCase())) {
//                            return DbColumnType.LOCAL_DATE_TIME;
//                        }
//                        return super.processTypeConvert(globalConfig, fieldType);
//                    }
//                })
//                .setDriverName("com.mysql.cj.jdbc.Driver")
//                .setUsername(username)
//                .setPassword(password)
//                .setUrl(url);
//    }
//
//    /**
//     * 获取GlobalConfig
//     *
//     * @return
//     */
//    protected GlobalConfig getGlobalConfig(String author, SeniorityEnum seniority, String moduleName) {
//        return new GlobalConfig()
//                // 生成文件的输出目录（默认值：D 盘根目录）
//                .setOutputDir(getJavaPath(seniority, moduleName))
//                // 是否覆盖已有文件（默认值：false）
//                .setFileOverride(false)
//                // 是否打开输出目录（默认值：true）
//                .setOpen(false)
//                // 是否在xml中添加二级缓存配置（默认值：false）
//                .setEnableCache(false)
//                // 开启 Kotlin 模式（默认值：false）
//                .setKotlin(false)
//                // 开启 swagger2 模式（默认值：false）
//                .setSwagger2(true)
//                // 开启 ActiveRecord 模式（默认值：false）
//                .setActiveRecord(false)
//                // 开启 BaseResultMap（默认值：false）
//                .setBaseResultMap(true)
//                // 开启 baseColumnList（默认值：false）
//                .setBaseColumnList(true)
//                // 时间类型对应策略（默认值：TIME_PACK）
//                .setDateType(DateType.TIME_PACK)
//                //作者
//                .setAuthor(author)
//                //自定义文件命名，注意 %s 会自动填充表实体属性！
//                .setEntityName("%s")
//                .setMapperName("%sMapper")
//                .setXmlName("%sMapper")
//                .setServiceName("I%sService")
//                .setServiceImplName("%sServiceImpl")
//                .setControllerName("%sRestController");
//    }
//
//
//    /**
//     * 获取根目录
//     *
//     * @param seniority
//     * @param moduleName
//     * @return
//     */
//    private static String getRootPath(SeniorityEnum seniority, String moduleName) {
//        String path;
//        switch (seniority) {
//            case MOGUL:
//                //生成到项目中（大佬采用此法）
//                path = System.getProperty("user.dir");
//                break;
//            case NOVICE:
//                //生成到D盘根目录（新手推荐的用法）
//                path = "D:";
//                break;
//            case MODULE:
//                //生成到指定目录
//                path = System.getProperty("user.dir").replace("micro-generate", MicroCloudCons.PACKAGE + "/" + moduleName);
//                break;
//            default:
//                throw new RuntimeException("Error: This generator method is not supported.");
//        }
//        return path;
//    }
//
//    /**
//     * 获取JAVA目录
//     *
//     * @return
//     */
//    protected static String getJavaPath(SeniorityEnum seniority, String moduleName) {
//        String javaPath = getRootPath(seniority, moduleName) + "/src/main/java";
//        System.err.println(" Generator Java Path:【 " + javaPath + " 】");
//        return javaPath;
//    }
//
//    /**
//     * 获取Resource目录
//     *
//     * @return
//     */
//    protected String getResourcePath(SeniorityEnum seniority, String moduleName) {
//        String resourcePath = getRootPath(seniority, moduleName) + "/src/main/resources";
//        System.err.println(" Generator Resource Path:【 " + resourcePath + " 】");
//        return resourcePath;
//    }
//
//
//    /**
//     * 获取AutoGenerator
//     *
//     * @param author          作者
//     * @param seniority       获取路径形式
//     * @param url             数据库连接地址
//     * @param username        数据库用户名
//     * @param password        数据库密码
//     * @param moduleName      模块名 如：micro-system
//     * @param packageLocation 路径包路径 如：com.sam4cloud.system.project
//     * @param packagePrefix   路径包前缀 不填则为不分包 效果 如：输入sys -> project.sys/mapper.sys
//     * @param tablePrefix     表前缀 输入前缀则自动去掉表名前缀 如：sys_
//     * @param tableName       表名 如：sys_user
//     * @return
//     */
//    protected AutoGenerator getAutoGenerator(String author, SeniorityEnum seniority, String url, String username, String password,
//                                             String moduleName, String packageLocation, String packagePrefix, String tablePrefix, String... tableName) {
//        return new AutoGenerator()
//                // 全局配置
//                .setGlobalConfig(getGlobalConfig(author, seniority, moduleName))
//                // 数据源配置
//                .setDataSource(getDataSourceConfig(url, username, password))
//                // 策略配置
//                .setStrategy(getStrategyConfig(tablePrefix, tableName))
//                // 包配置
//                .setPackageInfo(getPackageConfig(packageLocation, packagePrefix))
//                // 注入自定义配置，可以在 VM 中使用 cfg.abc 设置的值
//                .setCfg(getInjectionConfig(seniority, moduleName, packagePrefix))
//                // 模板配置
//                .setTemplate(getTemplateConfig());
//    }
//
//}
